package com.luo.ai.assistant.file;

import org.dromara.x.file.storage.core.FileInfo;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

/**
 * 文件存储服务
 *
 * @author luohq
 * @date 2025-01-02 10:01
 */
public interface MyFileStorageService {
    /**
     * 上传文件
     *
     * @param file     file
     * @param metadata metadata
     * @return file info
     */
    FileInfo uploadFile(MultipartFile file, Map<String, String> metadata);

    /**
     * 上传文件
     *
     * @param file     file
     * @param metadata metadata
     * @return file info
     */
    FileInfo uploadFile(File file, Map<String, String> metadata);

    /**
     * 根据文件URL下载文件到OutputStream
     *
     * @param fileUrl      fileUrl
     * @param outputStream outputStream
     */
    void downloadFileToOutputStream(String fileUrl, OutputStream outputStream);

    /**
     * 根据文件URL下载文件到字节数组
     *
     * @param fileUrl fileUrl
     * @return file bytes
     */
    byte[] downloadFileAsBytes(String fileUrl);

    /**
     * 根据文件URL下载文件到OutputStream
     *
     * @param fileUrl fileUrl
     * @return outputStream
     */
    OutputStream downloadFileAsOutputStream(String fileUrl);

    /**
     * 根据文件URL下载文件到Resource
     *
     * @param fileUrl fileUrl
     * @return file resource
     */
    Resource downloadFileAsResource(String fileUrl);

    /**
     * 根据文件信息下载文件到File
     *
     * @param fileInfo fileInfo
     * @return file
     */
    File downloadFile(FileInfo fileInfo);

    /**
     * 根据文件信息下载文件到FileSystemResource
     *
     * @param fileInfo fileInfo
     * @return FileSystemResource
     */
    FileSystemResource downloadFileAsResource(FileInfo fileInfo);

    /**
     * 根据文件URL获取文件信息
     *
     * @param fileUrl fileUrl
     */
    void deleteFile(String fileUrl);

    /**
     * 根据文件ID集合批量删除文件
     *
     * @param ids 文件ID集合
     */
    void deleteFileByIds(List<String> ids);
}